<?php
// +-----------------------------------------------------------------------+
// |                                                                       |
// | WebFormsQA     (Question - Answer)                                    |
// | Copyright  (C) 2010                                                   |
// | Official site  www.scale-tech.ru                                      |
// | email          scale-tech@mail.ru                                     |
// | autor          Alexander Demachev                                     |
// |                                                                       |
// | This program is free software; you can redistribute it and/or modify  |
// | it under the terms of the GNU General Public License as published by  |
// | the Free Software Foundation; version 2 of the License.               |
// |                                                                       |
// | This program is distributed in the hope that it will be useful,       |
// | but WITHOUT ANY WARRANTY; without even the implied warranty of        |
// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         |
// | GNU General Public License for more details.                          |
// +-----------------------------------------------------------------------+

/*! 
 * @page PagePage Исходный код класса Page
 * @include page.class.php
 */

/*! @addtogroup ClassWebFormsQA Основные классы проекта
 *  Группа включает основные классы используемые в проекте WebFormsQA
 *  @{
 */


/** 
 * @class Page
 * @brief Базовый класс, отвечает за описание интерфейса класса страница\n
 * @ref PagePage 
 *       
 * Любой класс страницы должен наследоваться от этого класса  
 */
class Page {
	
	/**
	 * @var bool $page_default 
	 * @brief переменная - флаг, определяет может ли страница использоваться по умолчанию,
	 *        например в том случае, если не одна из возможных страниц не выбрана
	 */
	var $page_default = false;
	
    /** 
     * @var array $attr 
     * @brief Ассоциативный массив для хранения входных атрибутов (ключей) страницы, которые могут быть переданы методом GET 
     * 		  например index.php?key1=value1&key2=value2 или методом POST
     *		 Массив предназначен для хранения данных по атрибутам в формате
     * -     $attr["name"]["type"] 	- строка, тип атрибута например integer
     * -     $attr["name"]["set"] 	- boolean, наличие атрибута
     * -     $attr["name"]["value"] - mixed,   значение атрибута
     *       ключ "name"      - название атрибута<br>
     *       ПРИМЕЧАНИЕ:      - возможны только типы используемые в функции settype(...)
     */
    var $attr      = array();
    
    /** 
     * @var string $name_template
     * имя шаблона smarty, который отвечает за отображение страницы                      
     */
    var $name_template = "";

   /** 
    * @var object $Smarty
    * ссылка на обьект шаблона                      
    */
    var $Smarty;

    /**
     * @brief конструктор
     * @param object &$smarty_obj 	- ссылка на обьект шаблона
     * @param array  $attr        	- массив атрибутов в формате
     *                       		  attr["name"] = name_type;
     * @param string $name_template - имя шаблона smarty, отвечающего
     *               				  за отображение подстраницы
     * ПРИМЕЧАНИЕ: только первый атрибут является атрибутом выбора данной страницы
     * 			   оставшиеся атрибуты проверяются только в случае его получения
     */
    function Page(&$smarty_obj, $attr, $name_template) 
    {
        $this->Smarty        = &$smarty_obj;
        $this->name_template = $name_template;

        foreach ($attr as $key => $type) {
            $this->attr[$key]['type'] 	= $type;
            $this->attr[$key]['set'] 	= false;
            $this->attr[$key]['value'] 	= 0;
        }
    }
    
    /*! 
     * @brief метод устанавливает признак страницы по умолчанию
     * @param bool $enable 	- признак необходимости выполнения данной страницы по умолчанию 
     */ 
    function setDefault( $enable )
    {
    	$this->page_default = $enable;
    }    
    

    /*! 
     * @brief метод обновляет страницу по умолчанию.
     * обычно вызывается при обходе всех подстраниц главной страницы, когда текущая страница не выбрана
     */
    function updateDefault()
    {
    	if( $this->page_default ) {
			//echo "<br> page_default <br>";    		
    		// явно устанавливаю передачу ключа перехода на страницу по умолчанию 
    		reset($this->attr);
    		$key_page = key($this->attr); 
    		$_GET["$key_page"] = '';
    		$this->update();
    		unset( $_GET["$key_page"] );
    	}
    	 	
    }

    /**
     * @brief обновить данные страницы,
     *        метод устанавливает название текущего шаблона страницы для Smarty "main_content_template"
     *        в случае приема методом GET или POST атрибута перехода на страницу, например index.php?name_page
     * @return bool успех операции
     */
    function update()
    {
        if( $flag_result = $this->checkAttr() ) {
            // устанавливаем контекст страницы
            $this->Smarty->assign("main_content_template", $this->name_template);
        }

        return $flag_result;
    } // end update()

    /** 
     * @brief проверить присутствие атрибута в строке запроса, 
     *  метод проверяет наличие всех входных атрибутов, которые были указанны при вызове конструктора страницы
     *  причем вначале рассматривается первый атрибут - ключ перехода на страницу, если его нет, то остальные атрибуты
     *  не рассматриваются.
     *  Со стороны клиента атрибуты могут передаваться двумя способами методы GET и POST. Класс Page
     *  не различает каким образом атрибут был принят, атрибуты ищутся в обоих массивах, вначале $_GET, затем $_POST  
     *  Значение атрибута копируется во внутренний массив класса $this->attr, где: 
     * - $this->attr["$name"]["set"] = признак наличия атрибута;
     * - $this->attr["$name"]["value"] = значение атрибута;
     *  
     * ПРИМЕЧАНИЕ: атрибут явно приводится к тому типу, который был указан к конструкторе при создании страницы
     *             методом  settype()
     */
    function checkAttr()
    {
        $flag_result = false;

        $j = 0;

        foreach ($this->attr as $name => $means) {

            $flag_get  = isset($_GET["$name"]);
            $flag_post = isset($_POST["$name"]);
            if($flag_get || $flag_post) {
            	
                // первый атрибут является атрибутом выбора страницы
                // по умолчанию
                if ($j == 0) $flag_result = true;

                // остальные вспомогательные
                // тип атрибута
                // наличие атрибута
                $this->attr["$name"]["set"] = true;
                // значение
                $this->attr["$name"]["value"] = ($flag_get ? $_GET["$name"] : $_POST["$name"]);
                // явно приводим к ожидаемому типу
                settype($this->attr["$name"]["value"], $means['type']);

            } else {
                // значения атрибутов по умолчанию
                $this->attr["$name"]["set"] = false;
                $this->attr["$name"]["value"] = 0;
            }

            // нет атрибута выбора страницы, прекращаем анализ атрибутов
            if (!$flag_result) break;

            $j++;
        } // перебираем все атрибуты

        return $flag_result;
    } // end checkAttr()

    /**
     * метод отвечает за получение всех значений для переменных с одинаковым именем
     * в строке запроса например index?res=1&res=2&res=3
     *
     * @param string  $name_var - название переменной
     * @param string  $type     - тип переменной
     *
     * @return array - возвращает массив содержищий найденные переменные или пустой массив,
     * если таких переменных в строке запроса не найдено
     */
    function getVariablesFromQuerry($name_var, $type)
    {
        $result = array();
        $str = $_SERVER['QUERY_STRING'];

        $q   = explode( "&", $str );
        $out = array();
        for ($i=0; $i<count($q); $i++) {
            // разбираем каждую переменную отдельно
            parse_str($q[$i], $out);
            // при нахождении нужной переменной
            // явно устанавливаем ее тип
            if (array_key_exists($name_var, $out)) {
                settype($out[$name_var], $type);
                $result[] = $out[$name_var];
            }
        }

        return $result;
    }


}  // finish class Page

/*! @} */

?>



